import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import rcParams
import matplotlib
matplotlib.use('Agg')  # 'Agg' 适用于无 GUI 服务器

import matplotlib.pyplot as plt
import random
import time
import config
import os


# 设置字体为 SimHei（黑体），确保中文显示正常
rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

def draw_heatmap(file_path, select_feature,cmap="coolwarm"):


    timestamp = int(time.time() * 1000)  # 当前时间戳（毫秒）
    random_number = random.randint(1000, 9999)  # 生成四位随机数
    output_filename = f"{timestamp}_{random_number}.png"  # 拼接文件名

    # 设定输出文件夹路径
    output_dir = config.OUTPUT_FOLDER_ONE_UPPER  # 选择 config.py 里的路径
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # 拼接完整的输出文件路径
    output_file = os.path.join(output_dir, output_filename)

    """
    绘制上三角热图，显示特征之间的相关性。

    参数：
    - file_path: 输入文件路径，支持 Excel 格式。
    - select_feature: 目标列名称列表，用于选择需要分析的特征。
    - output_path: 输出图像保存路径，默认为 'heatmap.png'。
    - cmap (str): 热图的配色方案，默认为 "coolwarm"。
    """
    # 1. 读取数据
    #df = pd.read_excel(file_path)
    df = pd.read_excel(file_path, engine='openpyxl')
    df = df[select_feature]  # 选择目标特征列

    # 2. 计算相关矩阵
    correlation_matrix = df.corr()
    # 增加输出
    heat_values = []
    columns = correlation_matrix.columns.tolist()

    # 遍历上三角区域 (i < j)
    for i in range(len(columns)):
        for j in range(i + 1, len(columns)):
            var1 = columns[i]
            var2 = columns[j]
            value = round(correlation_matrix.iloc[i, j], 2)
            # 新增相关性类型判断
            corr_type = "正相关" if value >= 0 else "负相关"
            heat_values.append({
                "关联方": [var1, var2],
                "相关性": corr_type,
                "值": value
                  # 新增类型字段
            })

    # 3. 创建画布
    fig, ax = plt.subplots(figsize=(10, 8))

    # 4. 绘制上三角热图
    mask = np.tril(np.ones_like(correlation_matrix, dtype=bool), k=-1)  # 创建下三角遮罩，k=-1 排除对角线
    sns.heatmap(
        correlation_matrix,
        mask=mask,  # 应用遮罩，只显示上三角
        annot=True,  # 在热图上显示数值
        fmt=".2f",  # 数值格式为两位小数
        cmap=cmap,  # 使用指定的配色方案
        cbar=False,  # 不显示颜色条
        ax=ax
    )

    # 5. 将 x 轴标签放在上方
    ax.xaxis.tick_top()
    ax.xaxis.set_label_position('top')
    ax.tick_params(axis='x', which='major', pad=10, length=0)
    plt.xticks(rotation=90)  # 设置x轴标签旋转角度

    # 6. 将 y 轴标签放在右侧
    ax.yaxis.tick_right()
    ax.yaxis.set_label_position('right')
    ax.tick_params(axis='y', which='major', pad=10, length=0)
    plt.yticks(rotation=0)  # 设置y轴标签旋转角度

    # 7. 调整布局
    plt.tight_layout()


    # 8. 保存图像
    fig.savefig(output_file)
    print(f"热图已保存至: {output_file}")
    print("\n热力值列表（带相关性类型）：")
    for item in heat_values:
        print(f"{item['关联方'][0]} 与 {item['关联方'][1]},{item['相关性']},相关值: {item['值']} ")
   # plt.show()
    return heat_values,output_file



